package com.itheima.web;

import com.itheima.dao.ManagerDao;
import com.itheima.domain.Manager;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     /*   //post方式请求有中文会乱码，所以需要加utf-8
        request.setCharacterEncoding("utf-8");
        //响应防止乱码加utf-8
        response.setContentType("text/html;charset=utf-8");*/
        //创建manager对象
        Manager manager = new Manager();
        //使用BeanUtils工具类将获取的manager对象进行封装
      /*  try {
            BeanUtils.populate(manager,request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }*/
        try {
            BeanUtils.populate(manager,request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //获取得到的username和password
        //String username = request.getParameter("username");
        //String password = request.getParameter("password");
        //2.对username和password进行非空校验
        if (manager.getUsername()==null||"".equals(manager.getUsername())||manager.getPassword()==null||"".equals(manager.getPassword())){
            //如果出现username和password为空，则将错误信息打印在响应位置，并且完成页面跳转。
            //打印错误信息
            request.setAttribute("errorMsg","用户名或密码不能为空！！！");
            //页面跳转，直接用页面跳转，不需要加虚拟路径。
            request.getRequestDispatcher("/login.jsp").forward(request,response);
//          response.getWriter().write("用户名或密码不能为空！！！");
            return;
        }


        /*3.验证码的校验，先校验验证码，如果不符合不用验证数据库中的username和password；
        思路是将客户端输入的验证码和服务器端生成的验证码进行对比，
        1.客户端通过请求体的getParameter方法获得，服务器端通过session中的getAttribute方法获得，
        2.然后两者进行对比。如果不同，那么就将错误信息输出，并且
        页面跳转至当前的login.jsp页面，使用页面跳转，不使用重定向。
        */
        /*String c_checkcode = request.getParameter("verifycode");
        Object s_checkcode = request.getSession().getAttribute("checkcode");
        if(c_checkcode.equalsIgnoreCase(s_checkcode.toString())){
            request.setAttribute("errorMsg","验证码输出错误！");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            return;
        }*/
        //3.1获取客户端输入的验证码
        String c_checkCode = request.getParameter("verifycode");// null 或 "";

        //3.2获取session中保存的验证码信息
        String s_checkCode = (String) request.getSession().getAttribute("checkCode");
        //3.3 防止验证码的重复使用，所以需要在使用之后移除验证码
        request.getSession().removeAttribute("checkCode");
        //3.4 将两者进行对比
        if(!c_checkCode.equalsIgnoreCase(s_checkCode)){
            //不一致的情况，需要分为两步
            //跳转页面
            //显示错误信息
            request.setAttribute("errorMsg","验证码输入错误!!!");
            //页面跳转使用请求转发
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            return;
        }

        //将获取的username和password封装到对象
        //Manager manager = new Manager();
        //manager.setUsername(username);
        //manager.setPassword(password);
        //将获得的对象与数据库中的对比
        ManagerDao managerDao = new ManagerDao();
        //调用方法来判断数据
        Manager login = managerDao.login(manager);
        if(login==null){
            //打印错误信息
//            response.getWriter().write("用户名或者密码错误！！！");、
            //1.保存错误信息
            request.setAttribute("errorMsg","用户名或者密码错误!!!"  );
            //2.跳转回当前页面
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            //3.打印错误信息

        }else{
            //正确的情况下跳转网页至/list.html
            //request.getRequestDispatcher("/list.html").forward(request,response);
            //response.sendRedirect("/UserManager/list.html");
            //用户名要在list.jsp中显示，所以要通过session获取其username
            HttpSession session = request.getSession();
            session.setAttribute("manager",login);


        /*记住用户名的思路：
        * 从登陆成功的点入手,条件：登陆成功加上勾选了“记住用户名”*/

        //判断用户是否选中记住用户名
            String remember = request.getParameter("remember");
        //判断是都等于value值rem字符串，如果相等代表选中了记住用户名，没有获得说明没有勾选记住用户名。
        //相等代表选中了记住用户名,记住用户名，则将信息存入cookie传递
            Cookie cookie = new Cookie("remember",login.getUsername());
            if ("rem".equals(remember)) {
                //如果存在，那么将cookie设置一个时间。
                cookie.setMaxAge(60*60*24*7);
            }else{
                //如果没有存在，那么将cookie的时间设置为0，即不记住cookie的时间。
                cookie.setMaxAge(0);
            }
            response.addCookie(cookie);

        }
        //response.sendRedirect(request.getContextPath()+"/list.jsp");
        //登陆成功后跳到userListServlet中，展示数据
        response.sendRedirect(request.getContextPath()+"/findUserByPageServlet");



    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
